package com.jingdianjichi.oss.config;


import com.jingdianjichi.oss.adapter.StorageAdapter;
import com.jingdianjichi.oss.adapter.AliossStorageAdapter;
import com.jingdianjichi.oss.adapter.MinioStorageAdapter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


/**
 * @Description:
 *              一种实现工厂思想的配置类：根据配置参数，自动地从多个Bean对象中选择合适的对象，并返回
 *              对比 最常用的工厂+策略模式：
 *                  工厂+策略模式： 策略将 多个 都 作为Bean对象，再通过 工厂 进行 map映射
 * @return:
 * @Author:  sky
 * @date:  2024/11/9 19:14
 */
@Configuration
@RefreshScope
public class StorageConfig {

    /**
     * @Description:  从nacos配置的参数里面读取
     *                 如果 参数发生变化
     *                 会 让 @RefreshScope注解修饰的类、方法 重新加载， 从而实现Bean对象的动态加载
     *                 实际应用：多个数据库的切换，本地缓存与redis缓存的切换，多个线程池的切换
     * @return:
     * @Author:  sky
     * @date:  2024/11/9 21:19
     */
    @Value("${storage.service.type}")
    private String storageType;

    @Bean
    @RefreshScope
    public StorageAdapter storageService(){
        if("minio".equals(storageType)){
            return new MinioStorageAdapter();
        }
        else if("aliyun".equals(storageType)){
            return new AliossStorageAdapter();
        }
        else{
            throw new IllegalArgumentException("未找到对应的文件存储处理器");
        }
    }


}
